﻿/*
* 大端字节序存储和小端字节序存储的概念
* 大端字节序存储：低字节存储在高地址处，高字节存储在低地址处
* 小段字节序存储：高字节存储在高地址处，低字节存储在低地址处
*/
#include<iostream>
#include<assert.h>
#include<string.h>
using namespace std;


//判断当前系统的大小端
void test01() {
	int num = 1;
	if (*(char*)&num == 1) {
		cout << "小端存储" << endl;
	}
	else {
		cout << "大端存储" << endl;
	}
}


//一个有趣的关于数据大小端存储的练习
//这里应该改为x86环境，即小端存储
void test02() {
	int a[4] = { 1,2,3,4 };
	int* ptr1 = (int*)(&a + 1);//首先，出现了&a即&数组名，此时这里的a代表一整个数组，因此+1后应跳过一整个数组，
	//此时ptr1指向4的下一个位置已经超过数组范围，然后ptr1[-1]又表示*(ptr1-1)，此时ptr1又指向4，所以ptr1[-1]=4
	int* ptr2 = (int*)((int)a + 1);//这里a单独出现，a只代表首元素地址，现将首元素地址强转为整形并加一，在地址的角度
	//上只是表示移动了一个字节，然后又强转为整形指针，那么解引用读取的时候会读取4个字节，所以*ptr2=2000000
	//图解如下
/*	现在是小端存储
	01 00 00 00 | 02 00 00 00 | 03 00 00 00 | 04 00 00 00
	   |____________绿色线代表*ptr2读取的范围 00000002 因为是小端，且要求是16进制打印，所以*ptr2 = 2000000
	  ptr1   
此时ptr1指向这个位置
*/
	printf("%x,%x", ptr1[-1], *ptr2);//这里输出位4，2000000
}
int main() {
	test01();
	test02();
	return 0;
}